package br.com.lojapi.dao;

import br.com.lojapi.bean.Categoria;
import br.com.lojapi.bean.Cliente;
import br.com.lojapi.bean.Fabricante;
import br.com.lojapi.bean.Fornecedor;
import br.com.lojapi.bean.Produto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Beto
 */
public class ProdutoDAOImp implements ProdutoDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        Produto produto = (Produto) obj;
        PreparedStatement psmt = null;
        Connection conn = null;
        try {
            String sql = "INSERT INTO produto(nome, marca, modelo, quantidade, precoCusto, "
                    + "precoVenda, descricao, idCategoria, idFornecedor, idFabricante)"
                    + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            conn = FabricaConexao.getConnection();
            psmt = conn.prepareStatement(sql);
            psmt.setString(1, produto.getNome());
            psmt.setString(2, produto.getMarca());
            psmt.setString(3, produto.getModelo());
            psmt.setInt(4, produto.getQuantidade());
            psmt.setDouble(5, produto.getPrecoCusto());
            psmt.setDouble(6, produto.getPrecoVenda());
            psmt.setString(7, produto.getDescricao());
            psmt.setInt(8, produto.getCategoria().getId());
            psmt.setInt(9, produto.getFornecedor().getId());
            psmt.setInt(10, produto.getFabricante().getId());
            psmt.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao salvar produto!"
                    + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, psmt);
        }
        return produto;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        Produto produto = (Produto) obj;
        PreparedStatement psmt = null;
        Connection conn = null;
        try {
            String sql = "UPDATE produto SET nome = ?, marca = ?, modelo = ? quantidade = ? "
                    + "precoCusto = ?, precoVenda = ?, descricao = ?, "
                    + "idCategoria = ?, idFornecedor = ?, idFabricante = ? WHERE id = ?";
            conn = FabricaConexao.getConnection();
            psmt.setString(1, produto.getNome());
            psmt.setString(2, produto.getMarca());
            psmt.setString(3, produto.getModelo());
            psmt.setInt(4, produto.getQuantidade());
            psmt.setDouble(5, produto.getPrecoCusto());
            psmt.setDouble(6, produto.getPrecoVenda());
            psmt.setString(7, produto.getDescricao());
            psmt.setInt(8, produto.getCategoria().getId());
            psmt.setInt(9, produto.getFornecedor().getId());
            psmt.setInt(10, produto.getFabricante().getId());
            psmt.setInt(11, produto.getId());
            psmt.executeUpdate();

        } catch (Exception e) {
            System.out.println("Erro ao alterar produto " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, psmt);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement psmt = null;
        Connection conn = null;
        try {
            String consulta = "DELETE FROM produto WHERE id = ?";
            conn = FabricaConexao.getConnection();
            psmt = conn.prepareStatement(consulta);
            psmt.setInt(1, id);
            psmt.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao excluir " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, psmt);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Produto produto = null;
        try {
            String SQL = "SELECT * FROM produto p "
                    + "JOIN categoria ca ON ca.id = p.idCategoria"
                    + "JOIN fornecedor forn ON forn.id = p.idFornecedor"
                    + "JOIN fabricante fabr ON fabr.id = p.idFabricante"
                    + "WHERE p.nome LIKE ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            while (rs.next()) {
                produto.setCategoria(new Categoria());
                produto.setFornecedor(new Fornecedor());
                produto.setFabricante(new Fabricante());
                produto.setId(rs.getInt("p.id"));
                produto.setNome(rs.getString("p.nome"));
                produto.setMarca(rs.getString("marca"));
                produto.setModelo(rs.getString("modelo"));
                produto.getCategoria().setId(rs.getInt("ca.id"));
                produto.getCategoria().setNome(rs.getString("ca.nome"));
                produto.getCategoria().setDescricao(rs.getString("ca.descricao"));
                produto.getFornecedor().setId(rs.getInt("forn.id"));
                produto.getFornecedor().setCnpj(rs.getString("forn.cnpj"));
                produto.getFornecedor().setContato(rs.getString("contato"));
                produto.getFabricante().setId(rs.getInt("fabr.id"));
                produto.getFabricante().setCnpj(rs.getString("fabr.cnpj"));
            }
        } catch (SQLException se) {
            System.out.println(" erro ---- " + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return produto;
    }

    @Override
    public List<Object> listar() throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs;
//        Categoria categoria = new Categoria();
//        Fornecedor fornecedor = new Fornecedor();
//        Fabricante fabricante = new Fabricante();
        Produto produto;
        Fornecedor fornecedor;
        Fabricante fabricante;
        List produtos = new ArrayList();
        try {
            String SQL = "SELECT * FROM produto";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while (rs.next()) {
                produto = new Produto();
                fornecedor = new Fornecedor();
                fabricante = new Fabricante();
                produto.setId(rs.getInt("id"));
                produto.setNome(rs.getString("nome"));
                produto.setMarca(rs.getString("marca"));
                produto.setModelo(rs.getString("modelo"));
                produto.setQuantidade(rs.getInt("quantidade"));
                produto.setPrecoCusto(rs.getDouble("precoCusto"));
                produto.setPrecoVenda(rs.getDouble("precoVenda"));
                fornecedor.setId(Integer.parseInt("id"));
                produto.setFornecedor(fornecedor);
                fabricante.setId(Integer.parseInt("id"));
                produto.setFabricante(fabricante);
                produtos.add(produto);
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao listar dados do produto"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return produtos;
    }

    @Override
    public List<Produto> pesquisaPorNome(String nome) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        List produtos = new ArrayList();
        try {
            String SQL = "SELECT * FROM produto p "
                    + "JOIN categoria ca ON ca.id = p.idCategoria"
                    + "JOIN fornecedor forn ON forn.id = p.idFornecedor"
                    + "JOIN fabricante fabr ON fabr.id = p.idFabricante"
                    + "WHERE p.nome LIKE ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();
            while (rs.next()) {
                Produto produto = new Produto();
                produto.setCategoria(new Categoria());
                produto.setFornecedor(new Fornecedor());
                produto.setFabricante(new Fabricante());
                produto.setId(rs.getInt("p.id"));
                produto.setNome(rs.getString("p.nome"));
                produto.setMarca(rs.getString("marca"));
                produto.setModelo(rs.getString("modelo"));
                produto.getCategoria().setId(rs.getInt("ca.id"));
                produto.getCategoria().setNome(rs.getString("ca.nome"));
                produto.getCategoria().setDescricao(rs.getString("ca.descricao"));
                produto.getFornecedor().setId(rs.getInt("forn.id"));
                produto.getFornecedor().setCnpj(rs.getString("forn.cnpj"));
                produto.getFornecedor().setContato(rs.getString("contato"));
                produto.getFabricante().setId(rs.getInt("fabr.id"));
                produto.getFabricante().setCnpj(rs.getString("fabr.cnpj"));
                produtos.add(produto);
            }
        } catch (SQLException se) {
            System.out.println(" erro ---- " + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return produtos;
    }
}